Following the SimpleTidy GeneCoEx workflow created by Dr. Chenxin Li for the analysis of co-expression networks.

Importing the necessary libraries for the analysis:

Importing the TPM gene expression matrix. It was generated by running Salmon on the RNA-seq data from the Kremling et al. (2018) paper and using the index of Maize v5 as the reference transcriptome. The matrix was filtered by TPM and coefficient of variation (CV) values.

Generating the Tidy data frame for the gene expression matrix:

Generating a wide version again (with log TPM values):

Importing metadata:

Generating a PCA:

Adding metadata to the PCA matrix:

Importing the correlation matrices. I (RACS) generated two different networks:

Later, a single network will also be generated, including both conditions.

Importing the two (day, night) networks:

We don’t really need duplicated information contained in the lower triangle of the matrix, so we can set it to NA:

For a initial edge selection, I (RACS) will use a correlation threshold of 0.5 (p-values and corrected p-values generated by corALS, so I will probably look at these values later):

dim(day_edge_table_select)
[1] 72637     3
dim(night_node_table)
[1] 3401    2

Creating the networks:

Clustering the networks:

For selection of the bait genes, we are probably going to use circadian genes, since we are comparing day and night periods.

Major factors in the experiment:

#Counting samples of different maize subpopulations
sample_metadata %>% 
  group_by(Subpopulation) %>% 
  count()
#Counting samples of different day periods
sample_metadata %>% 
  group_by(DayPeriod) %>% 
  count()
LS0tCnRpdGxlOiAiQ28tZXhwcmVzc2lvbiBuZXR3b3JrIGFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpGb2xsb3dpbmcgdGhlIFtTaW1wbGVUaWR5IEdlbmVDb0V4IHdvcmtmbG93XShodHRwczovL2dpdGh1Yi5jb20vY3hsaTIzMy9TaW1wbGVUaWR5X0dlbmVDb0V4KSBjcmVhdGVkIGJ5IERyLiBDaGVueGluIExpIGZvciB0aGUgYW5hbHlzaXMgb2YgY28tZXhwcmVzc2lvbiBuZXR3b3Jrcy4KCkltcG9ydGluZyB0aGUgbmVjZXNzYXJ5IGxpYnJhcmllcyBmb3IgdGhlIGFuYWx5c2lzOgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkoZ2dyYXBoKQojaW5zdGFsbC5wYWNrYWdlcygiZ2dyYXBoIikKbGlicmFyeShyZWFkeGwpCiNpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKQpsaWJyYXJ5KHBhdGNod29yaykKI2luc3RhbGwucGFja2FnZXMoInBhdGNod29yayIpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHZpcmlkaXMpCmBgYAoKSW1wb3J0aW5nIHRoZSBUUE0gZ2VuZSBleHByZXNzaW9uIG1hdHJpeC4gSXQgd2FzIGdlbmVyYXRlZCBieSBydW5uaW5nIFNhbG1vbiBvbiB0aGUgUk5BLXNlcSBkYXRhIGZyb20gdGhlIEtyZW1saW5nIGV0IGFsLiAoMjAxOCkgcGFwZXIgYW5kIHVzaW5nIHRoZSBpbmRleCBvZiBNYWl6ZSB2NSBhcyB0aGUgcmVmZXJlbmNlIHRyYW5zY3JpcHRvbWUuIFRoZSBtYXRyaXggd2FzIGZpbHRlcmVkIGJ5IFRQTSBhbmQgY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uIChDVikgdmFsdWVzLgoKYGBge3J9CkV4cF90YWJsZSA8LSByZWFkX3RzdigiL2hvbWUvcnNhbnRvcy9SZXBvc2l0b3JpZXMvbWFpemVfbWljcm9iaW9tZV90cmFuc2NyaXB0b21pY3MvcG9zdGVyX3ByZXNlbnRhdGlvbl9ub3RlYm9va3MvcGxhbnRfY2VudGVyX3JldHJlYXRfMjAyNC9rcmVtbGluZ19leHByZXNzaW9uX3Y1X3RwbV9maWx0ZXJlZF9jdl9maWx0ZXJlZC50c3YiLCBjb2xfdHlwZXMgPSBjb2xzKCkpCkV4cF90YWJsZQpgYGAKCkdlbmVyYXRpbmcgdGhlIFRpZHkgZGF0YSBmcmFtZSBmb3IgdGhlIGdlbmUgZXhwcmVzc2lvbiBtYXRyaXg6CgpgYGB7cn0KRXhwX3RhYmxlX2xvbmcgPC0gRXhwX3RhYmxlICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9ICFOYW1lLCBuYW1lc190byA9ICJTYW1wbGVOYW1lIiwgdmFsdWVzX3RvID0gIlRQTSIpICU+JSAKICBtdXRhdGUobG9nVFBNID0gbG9nMTAoVFBNICsgMSkpCgpoZWFkKEV4cF90YWJsZV9sb25nKQpgYGAKCkdlbmVyYXRpbmcgYSB3aWRlIHZlcnNpb24gYWdhaW4gKHdpdGggbG9nIFRQTSB2YWx1ZXMpOgoKYGBge3J9CkV4cF90YWJsZV9sb2dfd2lkZSA8LSBFeHBfdGFibGVfbG9uZyAlPiUgCiAgc2VsZWN0KE5hbWUsIFNhbXBsZU5hbWUsIGxvZ1RQTSkgJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBTYW1wbGVOYW1lLCB2YWx1ZXNfZnJvbSA9IGxvZ1RQTSkKCmhlYWQoRXhwX3RhYmxlX2xvZ193aWRlKQpgYGAKCkltcG9ydGluZyBtZXRhZGF0YToKCmBgYHtyfQpzYW1wbGVfbWV0YWRhdGEgPC0gcmVhZF90c3YoIi9ob21lL3JzYW50b3MvUmVwb3NpdG9yaWVzL21haXplX21pY3JvYmlvbWVfdHJhbnNjcmlwdG9taWNzL3Bvc3Rlcl9wcmVzZW50YXRpb25fbm90ZWJvb2tzL3BhZ18yMDI1L3NhbXBsZV9hbm5vdGF0aW9uLnR4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpoZWFkKHNhbXBsZV9tZXRhZGF0YSkKYGBgCgpHZW5lcmF0aW5nIGEgUENBOgoKYGBge3J9Cm15X3BjYSA8LSBwcmNvbXAodChFeHBfdGFibGVfbG9nX3dpZGVbLCAtMV0pKQpwY19pbXBvcnRhbmNlIDwtIGFzLmRhdGEuZnJhbWUodChzdW1tYXJ5KG15X3BjYSkkaW1wb3J0YW5jZSkpCmhlYWQocGNfaW1wb3J0YW5jZSwgMjApCmBgYAoKYGBge3J9CmhlYWQoYXMuZGF0YS5mcmFtZShteV9wY2EkeFssIDE6MTBdKSkKYGBgCgpBZGRpbmcgbWV0YWRhdGEgdG8gdGhlIFBDQSBtYXRyaXg6CgpgYGB7cn0KUENBX2Nvb3JkIDwtIG15X3BjYSR4WywgMToxMF0gJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgbXV0YXRlKFNhbXBsZU5hbWUgPSByb3cubmFtZXMoLikpICU+JSAKICBmdWxsX2pvaW4oc2FtcGxlX21ldGFkYXRhICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoR2Vub3R5cGUsIFN1YnBvcHVsYXRpb24sIERheVBlcmlvZCwgVGlzc3VlLCBTYW1wbGVOYW1lKSwgYnkgPSAiU2FtcGxlTmFtZSIpCgpoZWFkKFBDQV9jb29yZCkKYGBgCgpgYGB7cn0KUENBX2J5X2RheV9wZXJpb2QgPC0gUENBX2Nvb3JkICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBQQzEsIHkgPSBQQzIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IERheVBlcmlvZCksIGNvbG9yID0gImdyZXkyMCIsIHNoYXBlID0gMjEsIHNpemUgPSAzLCBhbHBoYSA9IDAuOCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyZXdlci5wYWwobiA9IDMsICJBY2NlbnQiKSkgKwogIGxhYnMoeCA9IHBhc3RlKCJQQzEgKCIsIHBjX2ltcG9ydGFuY2VbMSwgMl0gJT4lIHNpZ25pZigzKSoxMDAsICIlIG9mIFZhcmlhbmNlKSIsIHNlcCA9ICIiKSwgCiAgICAgICB5ID0gcGFzdGUoIlBDMiAoIiwgcGNfaW1wb3J0YW5jZVsyLCAyXSAlPiUgc2lnbmlmKDMpKjEwMCwgIiUgb2YgVmFyaWFuY2UpIiwgIiAgIiwgc2VwID0gIiIpLAogICAgICAgZmlsbCA9IE5VTEwpICsgIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPSAxNCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKQogICkKClBDQV9ieV9kYXlfcGVyaW9kCmBgYAoKYGBge3J9ClBDQV9ieV9zdWJwb3B1bGF0aW9uIDwtIFBDQV9jb29yZCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gUEMxLCB5ID0gUEMyKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBTdWJwb3B1bGF0aW9uKSwgY29sb3IgPSAiZ3JleTIwIiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDMsIGFscGhhID0gMC44KSArCiAgbGFicyh4ID0gcGFzdGUoIlBDMSAoIiwgcGNfaW1wb3J0YW5jZVsxLCAyXSAlPiUgc2lnbmlmKDMpKjEwMCwgIiUgb2YgVmFyaWFuY2UpIiwgc2VwID0gIiIpLCAKICAgICAgIHkgPSBwYXN0ZSgiUEMyICgiLCBwY19pbXBvcnRhbmNlWzIsIDJdICU+JSBzaWduaWYoMykqMTAwLCAiJSBvZiBWYXJpYW5jZSkiLCAiICAiLCBzZXAgPSAiIiksCiAgICAgICBmaWxsID0gTlVMTCkgKyAgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IDE0KSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpCiAgKQoKUENBX2J5X3N1YnBvcHVsYXRpb24KYGBgCgpJbXBvcnRpbmcgdGhlIGNvcnJlbGF0aW9uIG1hdHJpY2VzLiBJIChSQUNTKSBnZW5lcmF0ZWQgdHdvIGRpZmZlcmVudCBuZXR3b3JrczoKCiAqIERheQogKiBOaWdodAogCkxhdGVyLCBhIHNpbmdsZSBuZXR3b3JrIHdpbGwgYWxzbyBiZSBnZW5lcmF0ZWQsIGluY2x1ZGluZyBib3RoIGNvbmRpdGlvbnMuCgpJbXBvcnRpbmcgdGhlIHR3byAoZGF5LCBuaWdodCkgbmV0d29ya3M6CgpgYGB7cn0KZGF5X2Nvcl9tYXRyaXggPC0gYXMuZGF0YS5mcmFtZShyZWFkX3RzdigiL2hvbWUvcnNhbnRvcy9SZXBvc2l0b3JpZXMvbWFpemVfbWljcm9iaW9tZV90cmFuc2NyaXB0b21pY3MvcG9zdGVyX3ByZXNlbnRhdGlvbl9ub3RlYm9va3MvcGFnXzIwMjUvY29fZXhwX2RheV9wZWFyc29uX2NvcnJlbGF0aW9uLnRzdiIsIGNvbF90eXBlcyA9IGNvbHMoKSkpCnJvd25hbWVzKGRheV9jb3JfbWF0cml4KSA8LSBkYXlfY29yX21hdHJpeFssIDFdCmRheV9jb3JfbWF0cml4IDwtIGRheV9jb3JfbWF0cml4WywgLTFdCm5pZ2h0X2Nvcl9tYXRyaXggPC0gYXMuZGF0YS5mcmFtZShyZWFkX3RzdigiL2hvbWUvcnNhbnRvcy9SZXBvc2l0b3JpZXMvbWFpemVfbWljcm9iaW9tZV90cmFuc2NyaXB0b21pY3MvcG9zdGVyX3ByZXNlbnRhdGlvbl9ub3RlYm9va3MvcGFnXzIwMjUvY29fZXhwX25pZ2h0X3BlYXJzb25fY29ycmVsYXRpb24udHN2IiwgY29sX3R5cGVzID0gY29scygpKSkKcm93bmFtZXMobmlnaHRfY29yX21hdHJpeCkgPC0gbmlnaHRfY29yX21hdHJpeFssIDFdCm5pZ2h0X2Nvcl9tYXRyaXggPC0gbmlnaHRfY29yX21hdHJpeFssIC0xXQpgYGAKCldlIGRvbid0IHJlYWxseSBuZWVkIGR1cGxpY2F0ZWQgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBsb3dlciB0cmlhbmdsZSBvZiB0aGUgbWF0cml4LCBzbyB3ZSBjYW4gc2V0IGl0IHRvIE5BOgoKYGBge3J9CmRheV9jb3JfbWF0cml4X3RyaSA8LSBkYXlfY29yX21hdHJpeApkYXlfY29yX21hdHJpeF90cmlbbG93ZXIudHJpKGRheV9jb3JfbWF0cml4X3RyaSldIDwtIE5BCmhlYWQoZGF5X2Nvcl9tYXRyaXhfdHJpKQpuaWdodF9jb3JfbWF0cml4X3RyaSA8LSBuaWdodF9jb3JfbWF0cml4Cm5pZ2h0X2Nvcl9tYXRyaXhfdHJpW2xvd2VyLnRyaShuaWdodF9jb3JfbWF0cml4X3RyaSldIDwtIE5BCmhlYWQobmlnaHRfY29yX21hdHJpeF90cmkpCmBgYAoKRm9yIGEgaW5pdGlhbCBlZGdlIHNlbGVjdGlvbiwgSSAoUkFDUykgd2lsbCB1c2UgYSBjb3JyZWxhdGlvbiB0aHJlc2hvbGQgb2YgMC41IChwLXZhbHVlcyBhbmQgY29ycmVjdGVkIHAtdmFsdWVzIGdlbmVyYXRlZCBieSBjb3JBTFMsIHNvIEkgd2lsbCBwcm9iYWJseSBsb29rIGF0IHRoZXNlIHZhbHVlcyBsYXRlcik6CgpgYGB7cn0KIyBDb252ZXJ0aW5nIHRoZSBhZGphY2VuY3kgbWF0cml4IHRvIGFuIGVkZ2UgdGFibGUKZGF5X2VkZ2VfdGFibGUgPC0gZGF5X2Nvcl9tYXRyaXhfdHJpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIG11dGF0ZShmcm9tID0gcm93Lm5hbWVzKGRheV9jb3JfbWF0cml4KSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAhZnJvbSwgbmFtZXNfdG8gPSAidG8iLCB2YWx1ZXNfdG8gPSAiciIpICU+JQogIGZpbHRlcihpcy5uYShyKSA9PSBGKSAlPiUKICBmaWx0ZXIoZnJvbSAhPSB0bykKCmhlYWQoZGF5X2VkZ2VfdGFibGUpCmRpbShkYXlfZWRnZV90YWJsZSkKCiMgRmlsdGVyaW5nIGVkZ2VzIHdpdGggY29ycmVsYXRpb24gY29lZmZpY2llbnQgPj0gMC41CmRheV9lZGdlX3RhYmxlX3NlbGVjdCA8LSBkYXlfZWRnZV90YWJsZSAlPiUgCiAgZmlsdGVyKHIgPj0gMC41KQoKaGVhZChkYXlfZWRnZV90YWJsZV9zZWxlY3QpCmRpbShkYXlfZWRnZV90YWJsZV9zZWxlY3QpCgojIENvbnZlcnRpbmcgdGhlIGFkamFjZW5jeSBtYXRyaXggdG8gYW4gZWRnZSB0YWJsZQpuaWdodF9lZGdlX3RhYmxlIDwtIG5pZ2h0X2Nvcl9tYXRyaXhfdHJpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIG11dGF0ZShmcm9tID0gcm93Lm5hbWVzKG5pZ2h0X2Nvcl9tYXRyaXgpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9ICFmcm9tLCBuYW1lc190byA9ICJ0byIsIHZhbHVlc190byA9ICJyIikgJT4lCiAgZmlsdGVyKGlzLm5hKHIpID09IEYpICU+JQogIGZpbHRlcihmcm9tICE9IHRvKQoKaGVhZChuaWdodF9lZGdlX3RhYmxlKQpkaW0obmlnaHRfZWRnZV90YWJsZSkKCiMgRmlsdGVyaW5nIGVkZ2VzIHdpdGggY29ycmVsYXRpb24gY29lZmZpY2llbnQgPj0gMC41Cm5pZ2h0X2VkZ2VfdGFibGVfc2VsZWN0IDwtIG5pZ2h0X2VkZ2VfdGFibGUgJT4lIAogIGZpbHRlcihyID49IDAuNSkKCmhlYWQobmlnaHRfZWRnZV90YWJsZV9zZWxlY3QpCmRpbShuaWdodF9lZGdlX3RhYmxlX3NlbGVjdCkKYGBgCgoKCmBgYHtyfQptYWl6ZV9mdW5jdF9hbm5vIDwtIHJlYWRfZGVsaW0oIi9ob21lL3JzYW50b3MvUmVwb3NpdG9yaWVzL21haXplX21pY3JvYmlvbWVfdHJhbnNjcmlwdG9taWNzL3Bvc3Rlcl9wcmVzZW50YXRpb25fbm90ZWJvb2tzL3BsYW50X2NlbnRlcl9yZXRyZWF0XzIwMjQva3JlbWxpbmdfZXhwcmVzc2lvbl92NV90cG1fZmlsdGVyZWRfY3ZfZmlsdGVyZWRfYW5ub3RhdGlvbnMudHh0IiwgZGVsaW0gPSAiXHQiLCBjb2xfbmFtZXMgPSBGLCBjb2xfdHlwZXMgPSBjb2xzKCkpCmhlYWQobWFpemVfZnVuY3RfYW5ubykKCmRheV9ub2RlX3RhYmxlIDwtIGRhdGEuZnJhbWUoCiAgTmFtZSA9IGMoZGF5X2VkZ2VfdGFibGVfc2VsZWN0JGZyb20sIGRheV9lZGdlX3RhYmxlX3NlbGVjdCR0bykgJT4lIHVuaXF1ZSgpCikgJT4lIAogIGxlZnRfam9pbihtYWl6ZV9mdW5jdF9hbm5vLCBieSA9IGMoIk5hbWUiPSJYMSIpKSAlPiUgCiAgcmVuYW1lKGZ1bmN0aW9uYWxfYW5ub3RhdGlvbiA9IFgyKQpkaW0oZGF5X25vZGVfdGFibGUpCgpuaWdodF9ub2RlX3RhYmxlIDwtIGRhdGEuZnJhbWUoCiAgTmFtZSA9IGMobmlnaHRfZWRnZV90YWJsZV9zZWxlY3QkZnJvbSwgbmlnaHRfZWRnZV90YWJsZV9zZWxlY3QkdG8pICU+JSB1bmlxdWUoKQopICU+JSAKICBsZWZ0X2pvaW4obWFpemVfZnVuY3RfYW5ubywgYnkgPSBjKCJOYW1lIj0iWDEiKSkgJT4lIAogIHJlbmFtZShmdW5jdGlvbmFsX2Fubm90YXRpb24gPSBYMikKZGltKG5pZ2h0X25vZGVfdGFibGUpCmBgYAoKQ3JlYXRpbmcgdGhlIG5ldHdvcmtzOgoKYGBge3J9CmRheV9uZXR3b3JrIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSgKICBkYXlfZWRnZV90YWJsZV9zZWxlY3QsCiAgdmVydGljZXMgPSBkYXlfbm9kZV90YWJsZSwKICBkaXJlY3RlZCA9IEYKKQoKbmlnaHRfbmV0d29yayA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoCiAgbmlnaHRfZWRnZV90YWJsZV9zZWxlY3QsCiAgdmVydGljZXMgPSBuaWdodF9ub2RlX3RhYmxlLAogIGRpcmVjdGVkID0gRgopCmBgYAoKQ2x1c3RlcmluZyB0aGUgbmV0d29ya3M6CgpgYGB7cn0KZGF5X25ldF9tb2R1bGVzIDwtIGNsdXN0ZXJfbGVpZGVuKGRheV9uZXR3b3JrLCByZXNvbHV0aW9uX3BhcmFtZXRlciA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0aXZlX2Z1bmN0aW9uID0gIm1vZHVsYXJpdHkiKQpuaWdodF9uZXRfbW9kdWxlcyA8LSBjbHVzdGVyX2xlaWRlbihuaWdodF9uZXR3b3JrLCByZXNvbHV0aW9uX3BhcmFtZXRlciA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdGl2ZV9mdW5jdGlvbiA9ICJtb2R1bGFyaXR5IikKYGBgCgpgYGB7cn0Kb3B0aW1pemVfcmVzb2x1dGlvbiA8LSBmdW5jdGlvbihuZXR3b3JrLCByZXNvbHV0aW9uKXsKICBtb2R1bGVzID0gbmV0d29yayAlPiUgCiAgICBjbHVzdGVyX2xlaWRlbihyZXNvbHV0aW9uX3BhcmFtZXRlciA9IHJlc29sdXRpb24sCiAgICAgICAgICAgICAgICAgICBvYmplY3RpdmVfZnVuY3Rpb24gPSAibW9kdWxhcml0eSIpCiAgCiAgcGFyc2VkX21vZHVsZXMgPSBkYXRhLmZyYW1lKAogICAgZ2VuZV9JRCA9IG5hbWVzKG1lbWJlcnNoaXAobW9kdWxlcykpLAogICAgbW9kdWxlID0gYXMudmVjdG9yKG1lbWJlcnNoaXAobW9kdWxlcykpIAogICAgKQogIAogIG51bV9tb2R1bGVfNSA9IHBhcnNlZF9tb2R1bGVzICU+JSAKICAgIGdyb3VwX2J5KG1vZHVsZSkgJT4lIAogICAgY291bnQoKSAlPiUgCiAgICBhcnJhbmdlKC1uKSAlPiUgCiAgICBmaWx0ZXIobiA+PSA1KSAlPiUgCiAgICBucm93KCkgJT4lIAogICAgYXMubnVtZXJpYygpCiAgCiAgbnVtX2dlbmVzX2NvbnRhaW5lZCA9IHBhcnNlZF9tb2R1bGVzICU+JSAKICAgIGdyb3VwX2J5KG1vZHVsZSkgJT4lIAogICAgY291bnQoKSAlPiUgCiAgICBhcnJhbmdlKC1uKSAlPiUgCiAgICBmaWx0ZXIobiA+PSA1KSAlPiUgCiAgICB1bmdyb3VwKCkgJT4lIAogICAgc3VtbWFyaXNlKHN1bSA9IHN1bShuKSkgJT4lIAogICAgYXMubnVtZXJpYygpCiAgCiAgYyhudW1fbW9kdWxlXzUsIG51bV9nZW5lc19jb250YWluZWQpCgp9CmBgYAoKCmBgYHtyfQpvcHRpbWl6YXRpb25fcmVzdWx0cyA8LSBwdXJycjo6bWFwX2RmYygKICAueCA9IHNlcShmcm9tID0gMC4yNSwgdG8gPSAxMCwgYnkgPSAwLjI1KSwKICAuZiA9IG9wdGltaXplX3Jlc29sdXRpb24sIAogIG5ldHdvcmsgPSBkYXlfbmV0d29yawopICU+JSAKICB0KCkgJT4lIAogIGNiaW5kKAogICByZXNvbHV0aW9uID0gc2VxKGZyb20gPSAwLjI1LCB0byA9IDEwLCBieSA9IDAuMjUpCiAgKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUobnVtX21vZHVsZSA9IFYxLAogICAgICAgICBudW1fY29udGFpbmVkX2dlbmUgPSBWMikKCm9wdGltaXphdGlvbl9yZXN1bHRzCmBgYAoKYGBge3J9Ck9wdGltaXplX251bV9tb2R1bGUgPC0gb3B0aW1pemF0aW9uX3Jlc3VsdHMgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlc29sdXRpb24sIHkgPSBudW1fbW9kdWxlKSkgKwogIGdlb21fbGluZShzaXplID0gMS4xLCBhbHBoYSA9IDAuOCwgY29sb3IgPSAiZG9kZ2VyYmx1ZTIiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjcpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA2LjUsIHNpemUgPSAxLCBsaW5ldHlwZSA9IDQpICsKICBsYWJzKHggPSAicmVzb2x1dGlvbiBwYXJhbWV0ZXIiLAogICAgICAgeSA9ICJudW0uIG1vZHVsZXNcbncvID49NSBnZW5lcyIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIikKICApCgpPcHRpbWl6ZV9udW1fZ2VuZSA8LSBvcHRpbWl6YXRpb25fcmVzdWx0cyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcmVzb2x1dGlvbiwgeSA9IG51bV9jb250YWluZWRfZ2VuZSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjgsIGNvbG9yID0gInZpb2xldHJlZDIiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAwLjcpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA2LjUsIHNpemUgPSAxLCBsaW5ldHlwZSA9IDQpICsKICBsYWJzKHggPSAicmVzb2x1dGlvbiBwYXJhbWV0ZXIiLAogICAgICAgeSA9ICJudW0uIGdlbmVzIGluXG5tb2R1bGVzIHcvID49NSBnZW5lcyIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIikKICApCgp3cmFwX3Bsb3RzKE9wdGltaXplX251bV9tb2R1bGUsIE9wdGltaXplX251bV9nZW5lLCBucm93ID0gMikKYGBgCgoKRm9yIHNlbGVjdGlvbiBvZiB0aGUgYmFpdCBnZW5lcywgd2UgYXJlIHByb2JhYmx5IGdvaW5nIHRvIHVzZSBjaXJjYWRpYW4gZ2VuZXMsIHNpbmNlIHdlIGFyZSBjb21wYXJpbmcgZGF5IGFuZCBuaWdodCBwZXJpb2RzLgoKCmBgYHtyfQoKYGBgCgpNYWpvciBmYWN0b3JzIGluIHRoZSBleHBlcmltZW50OgoKYGBge3J9CiNDb3VudGluZyBzYW1wbGVzIG9mIGRpZmZlcmVudCBtYWl6ZSBzdWJwb3B1bGF0aW9ucwpzYW1wbGVfbWV0YWRhdGEgJT4lIAogIGdyb3VwX2J5KFN1YnBvcHVsYXRpb24pICU+JSAKICBjb3VudCgpCmBgYAoKYGBge3J9CiNDb3VudGluZyBzYW1wbGVzIG9mIGRpZmZlcmVudCBkYXkgcGVyaW9kcwpzYW1wbGVfbWV0YWRhdGEgJT4lIAogIGdyb3VwX2J5KERheVBlcmlvZCkgJT4lIAogIGNvdW50KCkKYGBgCgo=